package com.easyexcle.demo.exportEasy;


import java.util.ArrayList;
import java.util.Date;

import java.util.List;


import com.alibaba.excel.EasyExcel;
import com.alibaba.excel.ExcelWriter;
import com.alibaba.excel.write.metadata.WriteSheet;
import com.easyexcle.demo.exportEasy.pojo.ComplexHeadData;
import com.easyexcle.demo.exportEasy.pojo.DemoExportData;

import org.junit.Test;



/**
 * @Author: lkz
 * @Title: Test
 * @Description: TODO
 * @Date: 2022/10/18 16:48
 */

public class TestDemo {

    private String str="D:/easy/";

    @Test
    public void simpleWrite() {
        String fileName = "simpleWrite" + System.currentTimeMillis() + ".xlsx";
        // 这里 需要指定写用哪个class去写，然后写到第一个sheet，名字为模板 然后文件流会自动关闭
        // 如果这里想使用03 则 传入excelType参数即可
        EasyExcel.write(fileName, DemoExportData.class)
                .sheet("模板")
                .doWrite(this.data());
    }

    /**
     * 复杂头写入
     * <p>1. 创建excel对应的实体对象 参照{@link ComplexHeadData}
     * <p>2. 使用{@link }注解指定复杂的头
     * <p>3. 直接写即可
     */
    @Test
    public void complexHeadWrite() {
        String fileName = str+"complexHeadWrite" + System.currentTimeMillis() + ".xlsx";
        // 这里 需要指定写用哪个class去写，然后写到第一个sheet，名字为模板 然后文件流会自动关闭
        EasyExcel.write(fileName, ComplexHeadData.class).sheet("模板").doWrite(data());
    }

    /**
     * 重复多次写入
     * <p>
     * 1. 创建excel对应的实体对象 参照{@link ComplexHeadData}
     * <p>
     * 2. 使用{@link }注解指定复杂的头
     * <p>
     * 3. 直接调用二次写入即可
     */
    @Test
    public void repeatedWrite() {

      // String fileName  = str + "repeatedWrite1" + System.currentTimeMillis() + ".xlsx";

        // 这里 需要指定写用哪个class去写

//        // 方法1: 如果写到同一个sheet
//            // 这里注意 如果同一个sheet只要创建一次
//           ExcelWriter excelWriter = EasyExcel.write(fileName, DemoExportData.class).build();
//            WriteSheet writeSheet = EasyExcel.writerSheet("模板").build();
//            // 去调用写入,这里我调用了五次，实际使用时根据数据库分页的总的页数来
//            for (int i = 0; i < 5; i++) {
//                // 分页去数据库查询数据 这里可以去数据库查询每一页的数据
//                List<DemoExportData> data = data();
//                excelWriter.write(data, writeSheet);
//            }


        // 方法2: 如果写到不同的sheet 同一个对象
        String fileName2  = str + "repeatedWrite-2" + System.currentTimeMillis() + ".xlsx";
        // 这里 指定文件
            // 去调用写入,这里我调用了五次，实际使用时根据数据库分页的总的页数来。这里最终会写到5个sheet里面
        ExcelWriter excelWriter2 = EasyExcel.write(fileName2, DemoExportData.class).build();
            for (int i = 0; i < 5; i++) {
                // 每次都要创建writeSheet 这里注意必须指定sheetNo 而且sheetName必须不一样
                WriteSheet writeSheet2 = EasyExcel.writerSheet(i, "模板" + i).build();
                // 分页去数据库查询数据 这里可以去数据库查询每一页的数据
                excelWriter2.write(this.data(), writeSheet2);

        }

        // 方法3 如果写到不同的sheet 不同的对象
//        String fileName3  = str + "repeatedWrite-3" + System.currentTimeMillis() + ".xlsx";
//        // 这里 指定文件
//            // 去调用写入,这里我调用了五次，实际使用时根据数据库分页的总的页数来。这里最终会写到5个sheet里面
//        ExcelWriter excelWriter3 = EasyExcel.write(fileName3).build();
//            for (int i = 0; i < 5; i++) {
//                // 每次都要创建writeSheet 这里注意必须指定sheetNo 而且sheetName必须不一样。这里注意DemoData.class 可以每次都变，我这里为了方便 所以用的同一个class
//                // 实际上可以一直变
//                WriteSheet writeSheet3 = EasyExcel.writerSheet(i, "模板" + i).head(DemoExportData.class).build();
//                // 分页去数据库查询数据 这里可以去数据库查询每一页的数据
//                excelWriter3.write(this.data(), writeSheet3);
//            }


    }







    private List<List<String>> head() {
        List<List<String>> list = new ArrayList();
        List<String> head0 = new ArrayList();
        head0.add("字符串" + System.currentTimeMillis());
        List<String> head1 = new ArrayList();
        head1.add("数字" + System.currentTimeMillis());
        List<String> head2 = new ArrayList();
        head2.add("日期" + System.currentTimeMillis());
        list.add(head0);
        list.add(head1);
        list.add(head2);
        return list;
    }

    private List<List<Object>> dataList() {
        List<List<Object>> list =new ArrayList();
        for (int i = 0; i < 10; i++) {
            List<Object> data = new ArrayList();
            data.add("字符串" + i);
            data.add(new Date());
            data.add(0.56);
            list.add(data);
        }
        return list;
    }

    private List<DemoExportData> data() {
        List<DemoExportData> list = new ArrayList();
        for (int i = 0; i < 10; i++) {
            DemoExportData data = new DemoExportData();
            data.setString("字符串" + i);
            data.setDate(new Date());
            data.setDoubleData(0.56);
            list.add(data);
        }
        return list;
    }


}
